Skip to content

feat(boost): RHDHPLAN-1513 openspecs - #3755

Merged
mareklibra merged 19 commits into
redhat-developer:mainfrom
gabemontero:rhdhplan-1513-openspecs
Jul 28, 2026
Merged

feat(boost): RHDHPLAN-1513 openspecs#3755
mareklibra merged 19 commits into
redhat-developer:mainfrom
gabemontero:rhdhplan-1513-openspecs

Conversation

@gabemontero

Copy link
Copy Markdown
Contributor

Hey, I just made a Pull Request!

These are the openspec markdowns through tasks.md for all the RHIDP epics / stories under RHDHPLAN-1513

✔️ Checklist

  • [n/a] A changeset describing the change and affected packages. (more info)
  • [/] Added or Updated documentation
  • [n/a] Tests for new functionality and regression tests for bug fixes
  • [/] Screenshots attached (for UI changes)

gabemontero and others added 2 commits July 14, 2026 15:37
…m alignment

Create OpenSpec changes covering all 4 epics and 13 stories under
RHDHPLAN-1513 (AI Catalog Ingestion Operations & Upstream Schema Alignment):

- ingestion-health-dashboard (RHIDP-15331): 5 stories, 3 specs, 7 files
  Health status API, admin health UI, error classification

- connector-config-hot-reload (RHIDP-15332): 3 stories, 3 specs, 7 files
  Zod config schemas, RuntimeConfigResolver hot-reload, config admin UI

- ingestion-audit-metrics (RHIDP-15333): 3 stories, 3 specs, 7 files
  Sync audit events, analytics REST API, Eval Hub integration

- upstream-schema-alignment (RHIDP-15334): 2 stories, 2 specs, 6 files
  Annotation specification document, dry-run migration-readiness tooling

Cross-references RHDHPLAN-1507 (entity model), RHDHPLAN-1508 (audit
logging pattern), RHDHPLAN-1510 (connectors), and upstream Backstage
RFCs #32062 and #33060.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
RHIDP-15333 (Ingestion Audit Logging & Metrics) closed and absorbed
by RHIDP-15277 (AI Catalog RBAC Audit Logging, RHDHPLAN-1508).

Closed epic openspec (ingestion-audit-metrics/):
- .openspec.yaml status → consolidated with absorbing epic metadata
- proposal.md, design.md, tasks.md: consolidation headers with story mapping
- specs/audit-events: status → Consolidated into RHIDP-15280
- specs/analytics-api: status → Consolidated into RHIDP-15277
- specs/eval-hub-integration: status → Consolidated into RHIDP-15277

Surviving epic openspecs (consolidation cross-references):
- ingestion-health-dashboard: proposal.md + design.md annotations
- connector-config-hot-reload: proposal.md + design.md annotations
- upstream-schema-alignment: proposal.md + design.md annotations

Jira updates:
- RHIDP-15343 → CONSOLIDATED into RHIDP-15280, closed as Duplicate
- RHIDP-15344 → CONSOLIDATED into RHIDP-15277 scope, closed as Duplicate
- RHIDP-15345 → CONSOLIDATED into RHIDP-15277 scope, closed as Duplicate
- Blocks links: RHIDP-15295→15338, RHIDP-15258→15346, RHIDP-15258→15347

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 14, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 7:51 PM UTC · Completed 8:02 PM UTC
Commit: a04cf01 · View workflow run →

@rhdh-qodo-merge

Copy link
Copy Markdown

PR Summary by Qodo

Add Boost OpenSpecs for RHDHPLAN-1513 epics (with audit-metrics consolidation)

📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Add draft OpenSpec proposals/designs/specs/tasks for RHIDP-15331, RHIDP-15332, and RHIDP-15334.
• Document connector config hot-reload via RuntimeConfigResolver + AdminConfigService patterns.
• Mark RHIDP-15333 (ingestion audit/metrics) as consolidated into RHIDP-15277 (RHDHPLAN-1508).
Diagram

graph TD
  A["RHDHPLAN-1513 OpenSpecs"] --> B["Ingestion Health" (RHIDP-15331)] --> B1["Design/Specs/Tasks"]
  A --> C["Connector Hot-Reload" (RHIDP-15332)] --> C1["Design/Specs/Tasks"]
  A --> D["Schema Alignment" (RHIDP-15334)] --> D1["Annotation spec + CLI spec"]
  A --> E["Audit & Metrics" (RHIDP-15333)] --> F["Consolidated into RHIDP-15277"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Replace consolidated RHIDP-15333 docs with a short redirect stub
  • ➕ Avoids maintaining duplicate/obsolete design/spec details after consolidation
  • ➕ Reduces review burden and future confusion about the source of truth
  • ➖ Loses historical context for why RHIDP-15333 was originally scoped
  • ➖ Readers may need to chase links to understand what moved where
2. Centralize common cross-epic patterns into a shared OpenSpec reference
  • ➕ Reduces repeated explanations of RuntimeConfigResolver TTL/invalidation and audit-event patterns
  • ➕ Encourages consistent terminology across epics (RBAC gating, cache TTL, reconciliation cycles)
  • ➖ Adds an extra document reviewers must consult
  • ➖ Requires ongoing curation to keep shared reference aligned with each epic

Recommendation: Current approach is acceptable because each epic remains self-contained and explicitly calls out the RHIDP-15333 consolidation. If duplication becomes a maintenance issue, prefer a lightweight RHIDP-15333 redirect stub plus a shared reference doc for recurring patterns (runtime config + audit logging).

Files changed (27) +2682 / -0

Documentation (24) +2673 / -0
design.mdDesign doc for connector configuration hot-reload +141/-0

Design doc for connector configuration hot-reload

• Defines the architecture and decisions for extending RuntimeConfigResolver to connector config, including configScope rules, propagation timing, and credential rotation expectations. Explicitly notes RHIDP-15333 consolidation impact on audit events.

workspaces/boost/openspec/changes/connector-config-hot-reload/design.md

proposal.mdProposal for connector configuration hot-reload epic +44/-0

Proposal for connector configuration hot-reload epic

• Motivates runtime connector config changes without redeploys and outlines planned schema, propagation, and admin UI work. Calls out the consolidation of audit-event responsibilities under RHIDP-15277/15280.

workspaces/boost/openspec/changes/connector-config-hot-reload/proposal.md

spec.mdSpec for admin UI managing connector config overrides +204/-0

Spec for admin UI managing connector config overrides

• Specifies admin UX and API interactions for toggles, endpoints, schedules, read-only secret refs, validation feedback, RBAC gating, and audit-backed change history.

workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-admin-ui/spec.md

spec.mdSpec for Zod connector config schemas + configScope enforcement +115/-0

Spec for Zod connector config schemas + configScope enforcement

• Defines required connector schema fields, YAML-vs-DB override rules, validation failures, schema versioning/migrations, and defaulting behavior.

workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md

spec.mdSpec for runtime override propagation via TTL + reconciliation cycles +148/-0

Spec for runtime override propagation via TTL + reconciliation cycles

• Documents expected behavior for enable/disable, endpoint, schedule, and credential rotation timing, plus cache invalidation semantics and provider transition behavior.

workspaces/boost/openspec/changes/connector-config-hot-reload/specs/hot-reload-propagation/spec.md

tasks.mdImplementation task breakdown for connector hot-reload +99/-0

Implementation task breakdown for connector hot-reload

• Adds a phased task plan covering schema creation, resolver extension, provider integration, admin UI work, AdminConfigService endpoints, and testing/documentation.

workspaces/boost/openspec/changes/connector-config-hot-reload/tasks.md

.openspec.yamlMark ingestion-audit-metrics OpenSpec as consolidated +8/-0

Mark ingestion-audit-metrics OpenSpec as consolidated

• Adds OpenSpec metadata with status set to consolidated and records the absorption into RHIDP-15277 (RHDHPLAN-1508) with rationale.

workspaces/boost/openspec/changes/ingestion-audit-metrics/.openspec.yaml

design.mdDesign doc for ingestion audit logging + analytics (now consolidated) +213/-0

Design doc for ingestion audit logging + analytics (now consolidated)

• Captures the original design for ingestion audit events, analytics REST endpoints, quality score storage, and Eval Hub integration. Clearly states the entire scope is now delivered under RHIDP-15277/15280.

workspaces/boost/openspec/changes/ingestion-audit-metrics/design.md

proposal.mdProposal doc for ingestion audit logging + metrics (now consolidated) +58/-0

Proposal doc for ingestion audit logging + metrics (now consolidated)

• Explains compliance/observability motivations for ingestion auditing and analytics APIs and enumerates intended impacts. Includes explicit consolidation mapping of stories into RHIDP-15277/15280.

workspaces/boost/openspec/changes/ingestion-audit-metrics/proposal.md

spec.mdAnalytics API spec marked as consolidated +75/-0

Analytics API spec marked as consolidated

• Defines scenarios for sync history, quality scores, match coverage, RBAC gating, pagination, and filtering, with a header stating consolidation into RHIDP-15277.

workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/analytics-api/spec.md

spec.mdIngestion audit events spec marked as consolidated +72/-0

Ingestion audit events spec marked as consolidated

• Specifies scenarios for sync lifecycle and config-change audit event emission and formatting, with consolidation into RHIDP-15280.

workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/audit-events/spec.md

spec.mdEval Hub integration spec marked as consolidated +85/-0

Eval Hub integration spec marked as consolidated

• Documents expected configuration, ingestion behavior, storage, distribution computation, and failure handling for Eval Hub quality scores, with consolidation into RHIDP-15277.

workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/eval-hub-integration/spec.md

tasks.mdTask plan for ingestion audit/metrics (consolidated) +176/-0

Task plan for ingestion audit/metrics (consolidated)

• Provides a detailed implementation task list for audit events, analytics endpoints, DB storage, and Eval Hub ingestion, prefaced with consolidation guidance and cross-references for surviving epics.

workspaces/boost/openspec/changes/ingestion-audit-metrics/tasks.md

design.mdDesign doc for ingestion health admin dashboard +123/-0

Design doc for ingestion health admin dashboard

• Defines the health data model (sync_attempts), derived health states, Force Sync mechanism, UI integration approach, disconnected-cluster UX, and Neo4j status panel decisions.

workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md

proposal.mdProposal for ingestion health status API + admin UI +61/-0

Proposal for ingestion health status API + admin UI

• Motivates a connector health dashboard for incident response and air-gapped clusters, outlining APIs, UI, error classification, and Neo4j monitoring as planned deliverables.

workspaces/boost/openspec/changes/ingestion-health-dashboard/proposal.md

spec.mdSpec for admin health UI behaviors and states +166/-0

Spec for admin health UI behaviors and states

• Specifies PatternFly-based health cards, timestamps/metrics, error display, Force Sync UX, Neo4j panel behaviors, polling, and navigation integration.

workspaces/boost/openspec/changes/ingestion-health-dashboard/specs/admin-health-ui/spec.md

spec.mdSpec for connector error classification + guidance +154/-0

Spec for connector error classification + guidance

• Defines classification categories (auth/network/schema/rate-limit/unknown), diagnostic guidance requirements, extensibility for connector-specific patterns, and UI badge rendering expectations.

workspaces/boost/openspec/changes/ingestion-health-dashboard/specs/error-classification/spec.md

spec.mdSpec for ingestion health REST API + force-sync endpoints +135/-0

Spec for ingestion health REST API + force-sync endpoints

• Documents response shapes, status derivation rules, retention policy expectations, RBAC gating, force-sync lifecycle/polling, and Neo4j sync status/force-sync endpoints.

workspaces/boost/openspec/changes/ingestion-health-dashboard/specs/health-status-api/spec.md

tasks.mdImplementation task breakdown for ingestion health dashboard +121/-0

Implementation task breakdown for ingestion health dashboard

• Adds phased tasks for DB schema/repositories, API routes, error classifier, UI panel + navigation, Force Sync mechanics, Neo4j panel, and test coverage.

workspaces/boost/openspec/changes/ingestion-health-dashboard/tasks.md

design.mdDesign doc for upstream schema alignment readiness approach +107/-0

Design doc for upstream schema alignment readiness approach

• Defines a living mapping document from RHDH annotations/spec.type to draft upstream RFC kinds, plus a read-only dry-run CLI for migration readiness reporting.

workspaces/boost/openspec/changes/upstream-schema-alignment/design.md

proposal.mdProposal for annotation spec + migration-readiness tooling +58/-0

Proposal for annotation spec + migration-readiness tooling

• Positions the work as customer-facing assurance: document mappings to RFC #32062/#33060 and provide a read-only readiness assessment tool, explicitly deferring actual migration.

workspaces/boost/openspec/changes/upstream-schema-alignment/proposal.md

spec.mdSpec for the annotation specification document deliverable +111/-0

Spec for the annotation specification document deliverable

• Defines scenarios requiring complete documentation of rhdh.io/ai-asset-* annotations, all AI-related spec.type values, RFC mapping with confidence levels, and explicit future-work framing.

workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md

spec.mdSpec for dry-run migration-readiness CLI scaffold +136/-0

Spec for dry-run migration-readiness CLI scaffold

• Specifies read-only catalog enumeration, per-entity mapping reports, transformation/warning reporting, and JSON/text output formats with future-work disclaimer.

workspaces/boost/openspec/changes/upstream-schema-alignment/specs/migration-readiness-tooling/spec.md

tasks.mdImplementation task breakdown for schema alignment readiness +63/-0

Implementation task breakdown for schema alignment readiness

• Adds tasks for writing the annotation spec, scaffolding the CLI tool, testing its mapping/output behavior, and documenting usage and confidence semantics.

workspaces/boost/openspec/changes/upstream-schema-alignment/tasks.md

Other (3) +9 / -0
.openspec.yamlRegister connector-config-hot-reload OpenSpec (draft) +3/-0

Register connector-config-hot-reload OpenSpec (draft)

• Adds OpenSpec metadata declaring this change set as spec-driven and in draft status.

workspaces/boost/openspec/changes/connector-config-hot-reload/.openspec.yaml

.openspec.yamlRegister ingestion-health-dashboard OpenSpec (draft) +3/-0

Register ingestion-health-dashboard OpenSpec (draft)

• Adds OpenSpec metadata declaring this change set as spec-driven and in draft status.

workspaces/boost/openspec/changes/ingestion-health-dashboard/.openspec.yaml

.openspec.yamlRegister upstream-schema-alignment OpenSpec (draft) +3/-0

Register upstream-schema-alignment OpenSpec (draft)

• Adds OpenSpec metadata declaring this change set as spec-driven and in draft status.

workspaces/boost/openspec/changes/upstream-schema-alignment/.openspec.yaml

@codecov

codecov Bot commented Jul 14, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 54.68%. Comparing base (a04cf01) to head (f0fea0e).
⚠️ Report is 190 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3755      +/-   ##
==========================================
+ Coverage   54.65%   54.68%   +0.02%     
==========================================
  Files        2360     2362       +2     
  Lines       90140    90156      +16     
  Branches    25214    25214              
==========================================
+ Hits        49270    49302      +32     
- Misses      40598    40634      +36     
+ Partials      272      220      -52     
Flag Coverage Δ *Carryforward flag
adoption-insights 83.70% <ø> (ø) Carriedforward from 300ac1c
ai-integrations 67.53% <ø> (ø) Carriedforward from 300ac1c
app-defaults 69.79% <ø> (ø) Carriedforward from 300ac1c
augment 46.39% <ø> (ø) Carriedforward from 300ac1c
boost 73.77% <ø> (+0.64%) ⬆️
bulk-import 72.46% <ø> (ø) Carriedforward from 300ac1c
cost-management 14.10% <ø> (ø) Carriedforward from 300ac1c
dcm 61.81% <ø> (ø) Carriedforward from 300ac1c
extensions 61.53% <ø> (ø) Carriedforward from 300ac1c
global-floating-action-button 71.18% <ø> (ø) Carriedforward from 300ac1c
global-header 59.71% <ø> (ø) Carriedforward from 300ac1c
homepage 50.23% <ø> (ø) Carriedforward from 300ac1c
install-dynamic-plugins 56.77% <ø> (ø) Carriedforward from 300ac1c
konflux 91.49% <ø> (ø) Carriedforward from 300ac1c
lightspeed 69.02% <ø> (ø) Carriedforward from 300ac1c
mcp-integrations 85.46% <ø> (ø) Carriedforward from 300ac1c
orchestrator 43.74% <ø> (ø) Carriedforward from 300ac1c
quickstart 65.63% <ø> (ø) Carriedforward from 300ac1c
sandbox 79.56% <ø> (ø) Carriedforward from 300ac1c
scorecard 82.93% <ø> (ø) Carriedforward from 300ac1c
theme 61.26% <ø> (ø) Carriedforward from 300ac1c
translations 7.25% <ø> (ø) Carriedforward from 300ac1c
x2a 78.68% <ø> (ø) Carriedforward from 300ac1c

*This pull request uses carry forward flags. Click here to find out more.


Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update a04cf01...f0fea0e. Read the comment docs.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 14, 2026

Copy link
Copy Markdown

Review

Findings

Medium

  • [consumer-completeness] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md — The spec defines connector config keys under boost.connectors.<id>.* namespace, but the existing boostConfigFields registry uses flat top-level keys and BoostConfigKey is a literal union type (keyof typeof boostConfigFields). Adding dynamic connector keys would require either pre-registering every combination or changing BoostConfigKey from a literal union to a pattern-based type. The spec does not acknowledge this architectural gap — it assumes connector config "extends" the resolver trivially when the current key-registration model is static.
    Remediation: Add a design decision explicitly addressing how dynamic boost.connectors.<id>.* keys will be registered — whether via pre-registration of all known connectors, a pattern-based key type, or a separate registry.

  • [internal-consistency] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md — The design references AdminLayout.tsx for navigation integration and mentions existing admin panel patterns for "model connection, system prompt, agent config sections." No AdminLayout.tsx file exists in the boost frontend plugin, and no admin panel components exist in the frontend plugin tree. The spec describes integration with infrastructure that does not yet exist but presents it as "existing patterns."

  • [consumer-completeness] workspaces/boost/openspec/changes/ingestion-health-dashboard/specs/health-status-api/spec.md — Multiple specs reference RBAC gating via ai-catalog.admin permission. The existing permissions.ts defines permissions only in the boost.* namespace. Only ingestion-audit-metrics/tasks.md (task 14.1) includes a task to define it — but that change is consolidated/closed, making the dependency path unclear. The health dashboard and connector-config-hot-reload task lists have no equivalent task.
    Remediation: Add explicit task or dependency declaration in health-dashboard and hot-reload task lists for the ai-catalog.admin permission definition.

  • [pattern-inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/analytics-api/spec.md — The three spec.md files under ingestion-audit-metrics use a different scenario format from all 53+ existing spec.md files. Existing files use ## EXISTING/ADDED Requirements > ### Requirement: > #### Scenario: > bullet-list steps. These files use ## Scenarios > ### Scenario N: > bold GIVEN/WHEN/THEN with trailing line breaks. Same deviation in audit-events/spec.md and eval-hub-integration/spec.md.

  • [pattern-inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md — The two spec.md files under upstream-schema-alignment use a third format variant: top-level ## Scenario: headings with --- separators, no Requirement groupings. Same deviation in migration-readiness-tooling/spec.md. This is an active draft spec that should follow established conventions.

Low

  • [api-contract] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.mdSchedulerService.getTaskStatus() and SchedulerService.triggerTask() do not exist in the Backstage SchedulerService public API. The API provides scheduleTask() and createScheduledTaskRunner() but not status querying or ad-hoc triggering.

  • [internal-consistency] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md — Decision 5 and tasks.md (task 6.1) reference "Extend existing POST /api/boost/admin/config endpoint" — this REST endpoint does not exist yet and needs to be created. The service layer (AdminConfigService) exists but no REST route is exposed.

  • [internal-consistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md — The __schemaVersion key is described as "excluded from per-leaf Zod validation" while being registered in boostConfigFields. The current validateConfigValue() unconditionally calls field.schema.parse(value) on every registered key. The key will need a Zod schema — the description is a minor wording imprecision.

  • [internal-consistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md — The "Deployment-time field rejects DB override" scenario describes an error message (Unknown config key: credentials.secretRef) that does not match the existing validation mechanism. isDbWritable() accesses boostConfigFields[key].configScope without a guard for unknown keys.

  • [edge-case] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md — Health status derivation from last N=3 attempts: with 1 attempt, "Degraded" is logically impossible. A connector with one failure is "Failing" while one with one success then one failure is "Degraded" — this asymmetry during initial setup could confuse admins.

  • [cross-document-consistency] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md — Decision 2 references boost_sync_attempts table as established fact, but it is defined in another draft spec (ingestion-health-dashboard). The cross-spec dependency should be acknowledged as such.

  • [pattern-inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/.openspec.yaml — Introduces status: consolidated and a consolidation object with sub-fields, extending the .openspec.yaml schema beyond the three fields used by all 14 existing files.

  • [pattern-inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/analytics-api/spec.md — Status banners in ingestion-audit-metrics spec files use a multi-line format with emoji and metadata fields, diverging from the single-line > **Status: Draft** — format used elsewhere.

Previous run

Review

Findings

Medium

  • [Internal inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/tasks.md:27 — Task 2.7 lists connectors as "GitHub, Jira, Confluence" but every other document in the PR consistently lists the three connectors as "GitHub, GitLab, Jira". This appears to be a typo — "Confluence" should be "GitLab".
    Remediation: Change task 2.7 from "existing connectors (GitHub, Jira, Confluence)" to "existing connectors (GitHub, GitLab, Jira)".

Low

  • [Cross-reference inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md:86 — The design states runStatus is "owned by the boost_sync_attempts table" but no such column exists in the table schema defined in ingestion-health-dashboard Decision 1. The concept is derived from outcome/status fields rather than being a stored column.
    Remediation: Remove runStatus from the list or clarify it is a derived concept.

  • [Schema inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/design.md:176boost_quality_scores table uses TIMESTAMP while boost_sync_attempts uses TIMESTAMPTZ. Inconsistent timezone handling could cause issues in multi-timezone deployments.
    Remediation: Use TIMESTAMPTZ in the boost_quality_scores table schema.

  • [Specification gap] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md:84 — The __schemaVersion leaf key is not part of the Zod schema definitions but is expected to be stored alongside validated config values. The spec doesn't address how it interacts with Zod validation.
    Remediation: Clarify whether __schemaVersion is excluded before Zod validation or add it to connector schemas.

  • [Documentation correctness] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-admin-ui/spec.md:74 — Cron example renders as mangled text due to markdown escaping of asterisks (0 _/2 _ instead of 0 */2 * * *).
    Remediation: Wrap the cron expression in backticks for proper rendering.

  • [Document structure inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/analytics-api/spec.md — The three consolidated specs use flat ### Scenario N: headers with GIVEN/WHEN/THEN trailing-space format, diverging from the #### Scenario: under ### Requirement: groupings with bullet-list format used elsewhere in the PR and codebase.

  • [Document structure inconsistency] workspaces/boost/openspec/changes/ingestion-health-dashboard/specs/admin-health-ui/spec.md — The three specs under ingestion-health-dashboard/specs/ lack the "Specification Coverage" block present in connector-config-hot-reload specs, though this may be intentional since these are purely ADDED requirements with no existing behavior to validate.

  • [Heading level inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md — Both specs under upstream-schema-alignment/specs/ use ## Scenario: (h2) with --- separators instead of #### Scenario: (h4) under ### Requirement: groupings.
    Remediation: Restructure to use ### Requirement: groupings with #### Scenario: sub-headings. Remove --- separators.

  • [Section naming] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md:8 — Uses ## Overview heading not present in other spec files; other specs use a plain summary paragraph after the status blockquote.
    Remediation: Replace ## Overview with a plain paragraph.

  • [authorization-tier-mismatch] PR title uses feat(boost): but all changes are documentation-only. docs(boost): would be more accurate per conventional commits.

Previous run (2)

Review

Findings

Medium

  • [internal inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/tasks.md:27 — Task 2.7 lists connectors as "GitHub, Jira, Confluence", but every other document in this PR consistently references connectors as GitHub, GitLab, and Jira. The connector-config-hot-reload tasks (3.1, 3.5, 3.6), the ingestion-health-dashboard design (connector types in Decision 3), and the config-schemas spec all reference GitHub/GitLab/Jira. Confluence does not appear as a Boost connector anywhere else in the PR or the existing codebase. This appears to be a typo — "Confluence" should be "GitLab".
    Remediation: Change task 2.7 from "existing connectors (GitHub, Jira, Confluence)" to "existing connectors (GitHub, GitLab, Jira)".

  • [API contract] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md:81 — The Schema Versioning requirement describes storing a connector-level schema version as boost.connectors.jira.__schemaVersion. The existing AdminConfigService.validateStoredValues() checks whether each stored key exists in boostConfigFields and removes unknown keys on startup. If __schemaVersion keys are not registered in boostConfigFields, they will be silently deleted by the validation sweep.
    Remediation: Document that __schemaVersion leaf keys must be registered in boostConfigFields (with configScope: 'db-only') to survive the startup validation sweep, or that validateStoredValues() must be extended to handle metadata keys.

  • [format deviation] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/audit-events/spec.md — The three spec.md files under ingestion-audit-metrics deviate from the established spec format in multiple ways: (1) they use GIVEN/WHEN/THEN bold-keyword format instead of the dash-bullet - **WHEN** / - **THEN** pattern; (2) they lack the ## EXISTING Requirements / ## ADDED Requirements section structure; (3) they use flat numbered scenario headings instead of ### Requirement: / #### Scenario: nesting. All other spec.md files in this PR and in the existing codebase follow the dash-bullet pattern with nested headings. Note: these specs are consolidated (absorbed into RHIDP-15277), so they serve primarily as historical records.
    Remediation: Reformat to use the dash-bullet scenario pattern with ## ADDED Requirements / ### Requirement: / #### Scenario: nesting, matching the convention used by all other spec files.

Low

  • [algorithm logic] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md:37 — The spec describes RuntimeConfigResolver.resolve() reading YAML baseline values at boost.connectors.jira.enabled, but boostConfigFields currently contains only boost.model.*, boost.systemPrompt, boost.security.*, etc. The type system will reject connector config keys unless boostConfigFields is extended. Tasks 2.1-2.2 correctly capture this work, but the spec describes the behavior without noting the prerequisite extension.

  • [internal inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-admin-ui/spec.md:54 — The spec uses ai-catalog.admin RBAC permission, which does not exist in the current permissions.ts (only boost.admin and boost.config.manage are defined). The permission is used consistently across multiple spec areas and ingestion-audit-metrics/tasks.md task 14.1 captures creating it, but implementers should be aware this is a new permission.

  • [internal inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/hot-reload-propagation/spec.md:56 — The scenario "Switch from interval to cron schedule" says admin "removes schedule.intervalMs" but does not describe the removal mechanism or what happens when both schedule.intervalMs and schedule.cron are set simultaneously. The existing AdminConfigService has removeOverride(), so the mechanism exists, but the precedence between interval-based and cron-based scheduling when both are present is unspecified.

  • [status-format-inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/.openspec.yaml:3 — Uses status: consolidated with an additional consolidation: metadata block. All 10 existing spec areas and the other 3 new spec areas use only status: draft with three fields. This is a reasonable extension for representing consolidated state, but introduces a new schema variant without precedent.

Previous run (3)

Review

Findings

Medium

  • [Internal consistency] workspaces/boost/openspec/changes/upstream-schema-alignment/proposal.md:52 and workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md:81 — The mapping table lists Skill Bundle with spec.type: skill-bundle, but the authoritative entity model design document (ai-catalog-entity-model/design.md Decision 1) defines it as spec.type: ai-skill-bundle. The annotation-specification spec in this same PR cross-references that document as the "source of truth for current RHDH AI Asset entity mappings," creating a contradiction within the PR itself. If the migration-readiness tool is built from this spec, it would use the wrong spec.type value when querying catalog entities.
    Remediation: Change skill-bundle to ai-skill-bundle in the Current spec.type column of proposal.md and in the spec.type values list of annotation-specification/spec.md.

Low

  • [Algorithm logic] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:104 — The "Degraded" health status (mixed results) is unreachable when only 1 sync attempt exists, since 1 attempt is necessarily all-success (Healthy) or all-failure (Failing). The "same rules apply" clause does not acknowledge this edge case.

  • [API behavior] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md:73 — The code sample uses if (!enabled) as a truthy check on the resolve() return value, treating undefined (key not set) identically to false (explicitly disabled). The Zod schema defaults section specifies defaults for schedule.intervalMs and batchSize but not for enabled — consider specifying the default to clarify behavior when no config exists.

  • [Implementation gap] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md:29 — The schema versioning scenario describes __schemaVersion as a leaf key and GET-prefix queries, neither of which exist in the current AdminConfigService. As a specification for future work, the gap is expected — noted here for implementer awareness.

  • [Edge case] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:117 — Force Sync's fallback path (without SchedulerService) uses coreServices.cache for run-state tracking, but Backstage's CacheService doesn't guarantee atomic check-and-set, leaving a potential race window between replicas.

  • [Format inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/analytics-api/spec.md, audit-events/spec.md, eval-hub-integration/spec.md — These three consolidated specs use ### Scenario N: with GIVEN/WHEN/THEN prose format, while all other spec files use the ### Requirement: / #### Scenario: hierarchy with bullet-list format.

  • [Section structure] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md and migration-readiness-tooling/spec.md — These specs use flat ## Scenario: headers with horizontal rule separators instead of the nested Requirement/Scenario hierarchy used elsewhere.

Previous run (4)

Review

Findings

Low

  • [Internal inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/proposal.md — The proposal lists tls and credentials among Zod schema fields, but design.md Decision 2 explicitly excludes deployment-time fields (tls.caFile, credentials.*, namespace) from the boost.connectors schema, placing them under catalog.providers.<id>.*. The proposal's field list should match the design: enabled, endpoint, schedule.intervalMs, schedule.cron, batchSize, timeout.connectionMs.

  • [Internal inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md — The "Deployment-time field rejects DB override" scenario uses boost.connectors.jira.credentials.secretRef as the example key, but the design states credentials.* fields live under catalog.providers.<id>.*. The THEN clause correctly identifies the rejection reason ("not a valid boost.connectors field"), but the WHEN clause uses the wrong namespace prefix.

  • [Edge case handling gap] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md — A connector with exactly 1 failed sync attempt would immediately be classified as "Failing" (all 1 of 1 attempts failed). For brand-new connectors experiencing a single transient failure, this could trigger unnecessary alarm. Consider requiring a minimum number of attempts before declaring "Failing" status.

  • [Algorithm logic consistency] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md — Decision 2 references SchedulerService.triggerTask() and SchedulerService.getTaskStatus() for Force Sync, but these are not part of the standard Backstage SchedulerService API. The design does provide a fallback (direct provider.run() invocation), but the primary approach may need adjustment.

  • [Schema migration edge case] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md — The schema versioning scenario proposes per-connector schemaVersion tracking, but the existing AdminConfigService uses a single global BOOST_CONFIG_SCHEMA_VERSION. The implementation will need to reconcile these approaches.

  • [Document structure inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/.openspec.yaml — This file uses an expanded YAML schema with consolidation sub-keys not established elsewhere. While justified by the consolidation context, it introduces a new structure.

  • [Scenario format inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md, workspaces/boost/openspec/changes/upstream-schema-alignment/specs/migration-readiness-tooling/spec.md — Both upstream-schema-alignment spec files use a different document template: inline prose GIVEN/WHEN/THEN with --- separators and ## Scenario: headings, instead of the established bullet-prefixed format with ## ADDED Requirements / ### Requirement: / #### Scenario: heading hierarchy.

Previous run (5)

Review

Findings

Medium

  • [Internal inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/tasks.md:6 — Task 1.1 lists only 5 rhdh.io/ai-asset-category values (agent, skill, mcp-server, ai-model, model-server), omitting rule and skill-bundle. The proposal.md in the same directory correctly lists all 7 values. A developer following task 1.1 would produce an incomplete specification.
    Remediation: Update to include all 7 values: agent, skill, rule, skill-bundle, mcp-server, ai-model, model-server.

  • [Internal inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md:30 — The "Specification covers all spec.type values" scenario lists only 5 spec.type values (ai-agent, skill, mcp-server, ai-model, model-server), omitting rule and skill-bundle. The same file's earlier scenario correctly lists all 7 rhdh.io/ai-asset-category values — self-contradictory within the same document.
    Remediation: Add rule (AIResource kind) and skill-bundle (AIResource kind) to the spec.type list.

  • [Internal inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/tasks.md:38 — Task 3.1 says "all five AI Asset types" but the proposal.md mapping table defines 7 AI Asset types (Agent, Skill, MCP Server, AI Model, Rule, Skill Bundle, Model Server). Test coverage would be incomplete.
    Remediation: Change "all five" to "all seven".

Low

  • [Internal inconsistency] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:51 — Decision 1 defines a four-state health status enum (Healthy, Degraded, Failing, Unknown), but Decision 4 describes a "five-state model" that adds Disabled and claims it matches Decision 1. The design intent is clear (Disabled is derived from config state, not sync attempts), but the cross-reference is incorrect.
    Remediation: Remove the parenthetical "(matching Decision 1's health status enum)" from Decision 4, or add Disabled to Decision 1.

  • [Internal inconsistency] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:83 — Decision 3 status badge list shows "Healthy/Degraded/Failing/Disabled" but omits "Unknown", which Decision 4 and the admin-health-ui spec define as a fifth state with distinct visual treatment.
    Remediation: Update to "Healthy/Degraded/Failing/Disabled/Unknown".

  • [Internal inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md:36spec.type for Model Server listed as model-server but the proposal.md mapping table uses ai-model-server. The rhdh.io/ai-asset-category value is model-server (the annotation), but spec.type should be ai-model-server (the entity type).
    Remediation: Change to ai-model-server (Resource kind).

  • [scenario format inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/ — The upstream-schema-alignment spec files use flat ## Scenario: headers with GIVEN/WHEN/THEN paragraphs and horizontal rule separators. The ingestion-audit-metrics spec files use ### Scenario N: headers with GIVEN/WHEN/THEN and trailing double-space line breaks. Both diverge from the established codebase convention of nested ### Requirement: / #### Scenario: with bullet-point - **WHEN** / - **THEN** / - **AND** format (used by all existing openspec files and by the connector-config-hot-reload and ingestion-health-dashboard specs in this same PR).
    Remediation: Adopt the nested Requirement/Scenario structure with bullet-point format for consistency.

  • [edge-case] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:52 — The health derivation rule "if fewer than N attempts exist, the same rules apply" means a brand-new connector with a single transient failure would immediately show as Failing rather than Unknown or Degraded. This is technically correct per the stated rules but may produce overly alarming status for connectors just starting up.

  • [scope-coherence] workspaces/boost/openspec/changes/ingestion-audit-metrics/ — The ingestion-audit-metrics feature area is fully consolidated into RHIDP-15277/RHDHPLAN-1508, yet 6 new spec files are added. The .openspec.yaml correctly marks status: consolidated and all documents prominently note the consolidation. Including specs for historical completeness is reasonable since the PR's stated scope covers all RHDHPLAN-1513 epics.

Previous run (6)

Review

Findings

Medium

  • [internal-inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md:13 — The annotation specification lists 5 rhdh.io/ai-asset-category values (agent, skill, mcp-server, ai-model, model-server) but the final scenario in the same file claims coverage of "all 7 category values including skill, rule, skill-bundle, and model-server." The authoritative ai-catalog-entity-model/design.md Decision 1 defines 7 values — rule and skill-bundle are missing from the listing, creating an internal contradiction within the same document.
    Remediation: Add rule and skill-bundle to the rhdh.io/ai-asset-category values list.

  • [internal-inconsistency] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:97 — Decision 1 defines four health states derived from sync attempts (Healthy, Degraded, Failing, Unknown). Decision 4 adds Disabled as a fifth state from config. The health status API spec combines both in the response status field without documenting precedence — e.g., does Disabled preempt sync-based derivation? What if a disabled connector also has 3 recorded failures?
    Remediation: Clarify that Disabled (from enabled: false config) takes precedence over sync-derived status. Health derivation only applies to enabled connectors.

  • [spec-file-structure] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/audit-events/spec.md — The three ingestion-audit-metrics/specs/ files use a flat ## Scenarios / ### Scenario N: structure instead of the established ## EXISTING Requirements / ### Requirement: / #### Scenario: hierarchy used by all other openspec files. Also applies to analytics-api/spec.md and eval-hub-integration/spec.md.
    Remediation: Restructure to use the established Requirement/Scenario hierarchy.

Low

  • [api-contract] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md:72 — Code example shows RuntimeConfigResolver.resolve('boost.connectors.jira.enabled') as if it works out of the box. The actual resolve() accepts BoostConfigKey (a registered key union in boostConfigFields). Tasks 2.1/2.2 acknowledge the extension is needed, but the design examples could mislead about the current API surface.

  • [internal-inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/proposal.md:42 — The mapping table lists 5 AI asset types, omitting rule and skill-bundle defined in ai-catalog-entity-model/design.md Decision 1. Including them with Low confidence and "(no RFC yet)" notes would be more complete.

  • [api-contract] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md:149 — The design and task 6.1 reference POST /api/boost/admin/config as an existing endpoint to be extended. No such endpoint currently exists in the boost backend — it needs to be created.

  • [internal-inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md:76 — The "Deployment-time field rejects DB override" scenario uses boost.connectors.jira.credentials.secretRef as an example key. While the scenario correctly tests rejection (the THEN clause explains it), the WHEN clause could clarify this is an intentionally invalid key an admin might attempt.

  • [scenario-format] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/audit-events/spec.md — The consolidated specs use inline GIVEN/WHEN/THEN paragraph style instead of the established bullet-point style (- **WHEN**, - **THEN**, - **AND**).

  • [spec-file-structure] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md — Uses flat ## Scenario: with --- horizontal rule separators instead of the Requirement/Scenario hierarchy. Also applies to migration-readiness-tooling/spec.md.

  • [naming-convention] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/audit-events/spec.md — Uses numbered scenario names (### Scenario 1:) rather than descriptive names (e.g., #### Scenario: Sync start event emission). Also applies to analytics-api/spec.md and eval-hub-integration/spec.md.

  • [missing-authorization] No GitHub issue is linked to this PR. The Jira item RHDHPLAN-1513 serves as tracking, but no GitHub issue provides traceable authorization within the repository.

Previous run (7)

Review

Findings

Medium

  • [internal-consistency] workspaces/boost/openspec/changes/upstream-schema-alignment/proposal.md:46 — The mapping table states Model Server uses Current Kind: Component and Current spec.type: model-server. The existing ai-catalog-entity-model/design.md (Decision 1 mapping table, already merged) specifies model-server maps to kind: Resource with spec.type: ai-model-server. The annotation-specification/spec.md repeats the same incorrect mapping (model-server (Component kind)), propagating the inconsistency.
    Remediation: Align Model Server mapping with ai-catalog-entity-model/design.md: change Current Kind from Component to Resource and Current spec.type from model-server to ai-model-server in both proposal.md and annotation-specification/spec.md.

Low

  • [internal-consistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md:108 — The final scenario says the annotation spec cross-references catalog-entities/spec.md as the source of truth for current RHDH AI Asset entity mappings. However, catalog-entities/spec.md lists only 5 domain objects and does not include skill, rule, skill-bundle, or model-server. The more complete source of truth is ai-catalog-entity-model/design.md Decision 1.
    Remediation: Update the cross-reference to point to ai-catalog-entity-model/design.md Decision 1 as the primary source.

  • [internal-consistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md — Jira connector schema lists 6 fields but GitHub and GitLab schemas list only 4 fields (omitting schedule.cron and timeout.connectionMs). Meanwhile, tasks.md tasks 1.3/1.4 say "Define GitHub/GitLab connector config Zod schema with same field pattern", implying identical field sets.
    Remediation: Either update spec scenarios to include all 6 fields for GitHub/GitLab, or update tasks.md to say "with connector-appropriate field subset" instead of "same field pattern".

  • [edge-case] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:59 — Health status derivation: if fewer than 3 attempts exist, the same rules apply. With exactly 1 failed attempt, a brand-new connector immediately gets "Failing" status (no "Degraded" buffer). Internally consistent across design.md and health-status-api/spec.md, but may surprise operators.

  • [pattern-inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/analytics-api/spec.md — Five spec files across ingestion-audit-metrics/specs/ (3 files) and upstream-schema-alignment/specs/ (2 files) use paragraph-style GIVEN/WHEN/THEN format. This deviates from the established codebase convention (bullet-point format with - WHEN/- THEN/- AND under ADDED/EXISTING Requirements > Requirement > Scenario heading hierarchy), as used by connector-config-hot-reload/specs/ and ingestion-health-dashboard/specs/ in this same PR.
    Remediation: Restructure the 5 affected spec files to use the established bullet-point scenario format and heading hierarchy.

  • [pattern-inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md — The upstream-schema-alignment spec files include an ## Overview heading at the top, which is not present in existing spec files. The established convention is a single introductory paragraph (no heading) followed directly by the requirements sections.
    Remediation: Replace the ## Overview heading with an introductory paragraph.

  • [missing-authorization] No GitHub issue is linked to this PR. The PR references RHDHPLAN-1513 (an external Jira plan ID) but has no in-repo GitHub issue establishing authorized scope.
    Remediation: Confirm that RHDHPLAN-1513 in the external tracker serves as the authorization record, or link a GitHub issue.

Previous run (8)

Review

Findings

Medium

  • [internal-consistency] workspaces/boost/openspec/changes/ingestion-health-dashboard/proposal.md:46 — The proposal describes a "Four-state model" (enabled+healthy, enabled+failing, disabled, unknown) but the design.md (Decision 4) describes a "five-state model" that additionally includes "Enabled + Degraded." The health-status-api spec.md also lists 5 status values (healthy/degraded/failing/disabled/unknown). The proposal omits the "Degraded" state, creating an inconsistency between the proposal and the design/spec documents.
    Remediation: Update the proposal's "Disconnected-Cluster Health View Differentiation" section to describe a five-state model, adding "enabled+degraded" (yellow status badge, mixed results) to the list.

  • [api-contract] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md:72 — The implementation pattern shows runtimeConfigResolver.resolve('boost.connectors.jira.enabled') but the existing RuntimeConfigResolver.resolve() method accepts a BoostConfigKey type — a union of literal string types defined in boostConfigFields (schemas.ts). Currently boostConfigFields has no boost.connectors.* keys. The tasks.md section 2 (RuntimeConfigResolver Extension) mentions extending the resolver but doesn't explicitly mention extending boostConfigFields in schemas.ts, which is the prerequisite for making resolve('boost.connectors.jira.enabled') type-safe.
    Remediation: Add an explicit task to extend boostConfigFields in plugins/boost-backend/src/config/schemas.ts with connector config field definitions before the RuntimeConfigResolver extension tasks.

Low

  • [internal-consistency] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md:38 — The config namespace ownership table places tls.caFile, credentials.*, and namespace under the catalog.providers.<id>.* namespace (YAML-only), but the config-schemas spec includes these same fields in the Jira connector Zod schema alongside boost.connectors.<id>.* fields. This conflates two config namespaces in one schema. The configScope annotations enforce the correct behavior, but the spec could clarify that the schema covers both namespaces for validation while only boost.connectors.* keys flow through RuntimeConfigResolver.

  • [scenario-format-inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/analytics-api/spec.md — The three spec files under ingestion-audit-metrics use flat ## Scenarios / ### Scenario N: headings with inline GIVEN/WHEN/THEN, while other specs in this PR use the ## EXISTING/ADDED Requirements### Requirement:#### Scenario: hierarchy with dash-prefixed bullets. (These specs are consolidated/archived, so the impact is limited.)

  • [scenario-format-inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md — The two upstream-schema-alignment spec files use flat ## Scenario: headings with horizontal rule separators, deviating from the Requirement/Scenario hierarchy pattern used elsewhere in this PR.

  • [missing-authorization] The PR references RHDHPLAN-1513 in the title and body but has no linked GitHub issue. The JIRA reference and labels (documentation, enhancement, workspace/boost) provide reasonable context for a documentation-only PR.

  • [internal-consistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/hot-reload-propagation/spec.md:15 — Scenarios use abbreviated key paths (connectors.jira.enabled) while design.md and config-admin-ui spec consistently use the full boost.connectors.jira.enabled path. The RuntimeConfigResolver.resolve() requires the full dotted key path.

  • [edge-case-handling] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:66 — Health status derivation uses "last N attempts" without temporal weighting. A connector with 1 failed then 1 successful attempt (N=3) would be classified as "Degraded" even though the most recent attempt succeeded. This is a documented design tradeoff (simplicity vs. temporal precision).

  • [internal-consistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md:10 — The GitHub and GitLab connector schemas list fewer fields than Jira but the spec says "configScope annotations match Jira pattern." Clarify whether this refers to the configScope assignment policy (db-overridable vs yaml-only classification) or the exact field set.

Previous run (9)

Review

Findings

Medium

  • [Permission name inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/design.md — The ingestion-audit-metrics design uses ai-catalog.admin permission for analytics API RBAC gating, but the existing codebase defines boost.admin (in plugins/boost-common/src/permissions.ts). No ai-catalog.admin permission exists in the codebase. Task 14.1 in tasks.md acknowledges it needs creation, and the RHDHPLAN-1508 feasibility report references it as a planned permission.
    Remediation: Clarify that ai-catalog.admin is a new permission to be created under RHIDP-15277, or align with the existing boost.admin permission. The design should explicitly state whether this is a new permission or an existing one.

Low

  • [Internal consistency] workspaces/boost/openspec/changes/ingestion-health-dashboard/proposal.md:34 — The proposal describes a "four-state model" (enabled+healthy, enabled+failing, disabled, unknown) but design.md Decision 4 is titled "three-state model." Decision 1 defines four health statuses (Healthy, Degraded, Failing, Unknown) and the health-status-api spec lists five API status values. The inconsistency is in Decision 4's title wording — it focuses on disconnected-cluster UX rendering states but omits Unknown and Degraded from its enumeration.

  • [Internal consistency] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:90 — Decision 4 omits Degraded from its UX state enumeration. The admin-health-ui spec does assign yellow badge treatment for Degraded, so the gap is only in Decision 4's summary text. Consider updating the title to "three-state UX model" or adding Degraded/Unknown explicitly.

  • [API contract] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md:70 — Code example shows RuntimeConfigResolver.resolve('boost.connectors.jira.enabled') but BoostConfigKey does not currently include boost.connectors.* keys. This is expected for a pre-implementation design doc — tasks 2.1–2.2 explicitly cover extending BoostConfigKey.

  • [API contract] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-admin-ui/spec.md:24 — Spec references POST /api/boost/admin/config which does not exist yet as a route. AdminConfigService exists with setOverride/removeOverride methods; the HTTP route is planned work (task 6.1).

  • [Edge case] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/hot-reload-propagation/spec.md:56 — No precedence defined when both schedule.intervalMs and schedule.cron are set simultaneously. No mechanism for removing a DB override (reset to YAML baseline) is described. Consider adding a precedence rule and a reset action.

  • [Edge case] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md:33 — Design states providers not registered at startup cannot be hot-enabled, but doesn't specify validation for preventing an admin from setting boost.connectors.<id>.enabled: true when the provider was never registered. This could create a misleading UI state.

  • [Edge case] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:62 — With fewer than 3 sync attempts, a single failed sync immediately shows "Failing." This is a documented design trade-off but could alarm admins during initial connector setup.

  • [Stale reference] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-admin-ui/spec.md — Connector config UI scenarios are categorized under "EXISTING Requirements" but the entire connector config UI is new functionality. They should be under "ADDED Requirements" to match the pattern used by sibling specs (admin-health-ui, error-classification, health-status-api).

  • [Spec file structure] 5 spec files use non-standard heading hierarchy — ingestion-audit-metrics/specs/analytics-api/spec.md, audit-events/spec.md, eval-hub-integration/spec.md use ## Scenarios with numbered ### Scenario N: headings; upstream-schema-alignment/specs/annotation-specification/spec.md and migration-readiness-tooling/spec.md use ## Overview with H2-level ## Scenario: and --- separators. The established pattern across 41+ existing spec files is ## EXISTING/ADDED Requirements > ### Requirement: > #### Scenario: > - **WHEN** bullet format.

Previous run (10)

Review

Findings

Medium

  • [api-contract] workspaces/boost/openspec/changes/connector-config-hot-reload/design.md:65 — The implementation pattern shows RuntimeConfigResolver.resolve('boost.connectors.jira') returning an object with .enabled and .endpoint properties. The existing resolve() method accepts a BoostConfigKey (a finite union of specific leaf keys like boost.model.baseUrl) and returns a single scalar value (unknown | undefined), not a config object. The same issue appears in config-schemas/spec.md:61. The design assumes a scope-based object resolution API that does not exist in the current RuntimeConfigResolver.
    Remediation: Either (a) update the design to show per-leaf-key resolution matching the existing API (e.g., resolve('boost.connectors.jira.enabled')) or (b) explicitly document that resolve() needs a new overload or companion method for scope-based resolution, and add a corresponding task.

Low

  • [internal-inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/tasks.md:6 — Task 1.2 lists configScope annotations but omits tls.caFile from the yaml-only list, despite design.md Decision 2 explicitly listing it as yaml-only and task 1.1 including tls.caFile in the schema fields. Add tls.* to the yaml-only list.

  • [edge-case] workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md:96 — Health status derivation with default N=3: a connector with exactly 1 failed attempt is classified as "Failing" (all available attempts failed). This is aggressive for newly started connectors or single transient failures. Consider whether a minimum data-point threshold should apply.

  • [internal-inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/hot-reload-propagation/spec.md:5 — Summary states "Runtime overrides propagate to active connector instances within 30s TTL" but detailed scenarios show actual worst-case propagation is 30s TTL + reconciliation interval (up to 5m30s). The summary conflates cache TTL with total propagation time.

  • [internal-inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-admin-ui/spec.md:78 — Cron schedule example renders incorrectly due to markdown escaping (0 _/2 _ \* \* instead of 0 */2 * * *).

  • [pattern-inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/analytics-api/spec.md — The three consolidated spec files under ingestion-audit-metrics/specs/ use a different scenario format (### Scenario N: with GIVEN/WHEN/THEN prose) than the established repository pattern (#### Scenario: headings with - **WHEN**/- **THEN**/- **AND** bullet-point format, grouped under ## EXISTING/ADDED Requirements sections).

  • [pattern-inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/analytics-api/spec.md:1 — Status banners use emoji, which no other spec file in the repository uses. Use plain text for consistency.

  • [pattern-inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md — The two upstream-schema-alignment spec files use --- horizontal rule separators between scenarios and ## Scenario: (h2) headings without the established ## ADDED Requirements > ### Requirement: > #### Scenario: hierarchy used by all other spec files.

Previous run (11)

Review

Findings

Medium

  • [api-contract] workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md:37 — The spec references RuntimeConfigResolver.getConfig('connectors.jira'), but the actual RuntimeConfigResolver class has no getConfig() method. The only retrieval method is resolve(key: BoostConfigKey), which takes a single leaf key and returns a single value — not an object namespace. The design.md and hot-reload-propagation spec correctly use resolve(), but the config-schemas spec invents a non-existent API surface.
    Remediation: Align the spec to reflect the actual API — either document that resolve() will be extended to accept connector namespace keys, or describe retrieval as multiple resolve() calls for individual leaf keys.

  • [document-structure-inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md — Five spec files use a flat ## Scenario: / **GIVEN**/**WHEN**/**THEN** paragraph format with --- separators, instead of the established ## EXISTING/ADDED Requirements > ### Requirement: > #### Scenario: hierarchy with - **WHEN**/- **THEN**/- **AND** bullet format used by all 35 existing spec files and by the connector-config-hot-reload and ingestion-health-dashboard specs in this same PR. Affected files: annotation-specification/spec.md, migration-readiness-tooling/spec.md, analytics-api/spec.md, audit-events/spec.md, eval-hub-integration/spec.md.
    Remediation: Restructure to match the established spec.md pattern.

Low

  • [internal-inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/proposal.md:18 — The proposal lists db-only as a configScope value, but design.md Decision 2 explicitly states these fields (lastSyncTimestamp, lastSyncOutcome, runStatus) are NOT config — they are operational state in the sync_attempts table. The same phantom db-only reference appears in tasks.md task 8.2.

  • [internal-inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/tasks.md:5 — Task 1.1 omits tls.caFile from the Jira connector Zod schema field list, though it appears in design.md's configScope table, in the config-schemas spec, and in the design.md code example.

  • [internal-inconsistency] workspaces/boost/openspec/changes/ingestion-health-dashboard/proposal.md:59 — The Impact section lists the component path as plugins/boost/src/components/AdminPanels/, but the actual codebase path is workspaces/augment/plugins/augment/src/components/AdminPanels/. The tasks.md correctly references the latter path. See also: [naming-consistency] finding in tasks.md.

  • [internal-inconsistency] workspaces/boost/openspec/changes/connector-config-hot-reload/tasks.md:68 — Task 6.1 uses Express-style :connectorId placeholder inside a query parameter value (?key=boost.connectors.:connectorId), which is syntactically odd. Consider {connectorId} brace notation.

  • [internal-inconsistency] workspaces/boost/openspec/changes/ingestion-audit-metrics/design.md:129 — The boost_quality_scores table schema defines score DECIMAL(5, 3) (allows -99.999 to 99.999) but lacks a CHECK constraint to enforce the documented 0.0–1.0 range.

  • [scope-coherence] workspaces/boost/openspec/changes/ingestion-audit-metrics/ — The ingestion-audit-metrics feature area has full specs and 17 task groups despite being consolidated into RHIDP-15277. Each file does include a consolidation banner, but the unchecked task checkboxes could lead implementers to treat these as actionable work.

  • [cross-reference-consistency] workspaces/boost/openspec/changes/connector-config-hot-reload/proposal.md:5 — The proposal states connector config changes should emit ingestion.config.change audit events, but neither the design.md nor tasks.md for this feature area includes this work — it was delegated to RHIDP-15277 but the delegation is not noted in the tasks.

  • [naming-convention] workspaces/boost/openspec/changes/ingestion-audit-metrics/specs/analytics-api/spec.md:1 — Five spec files use a Spec: title prefix not found in any of the 35 existing spec files. Affected: analytics-api, audit-events, eval-hub-integration, annotation-specification, migration-readiness-tooling.

  • [status-header-inconsistency] workspaces/boost/openspec/changes/upstream-schema-alignment/specs/annotation-specification/spec.md:4 — Two upstream-schema-alignment specs use bold key-value metadata lines with emoji instead of the established > **Status: Draft** — Pre-implementation specification. blockquote format.

Previous run (12)

Review

Verdict: Comment — medium-severity findings worth noting for spec accuracy, but none blocking for draft pre-implementation specifications.

Summary

This PR adds 27 new openspec documents (design, proposal, specs, tasks) for four RHDHPLAN-1513 feature areas under workspaces/boost/openspec/changes/. The documents follow the established openspec conventions in the repo (matching structure of existing specs like ai-chat-interaction-experience, platform-operations-deployment). The technical content is thorough and well-organized.

However, several specifications describe API surfaces that diverge from the existing codebase without acknowledging the gap. Since these specs describe "extending existing infrastructure," clarity about what's reused vs. new is important for implementation accuracy.

Findings

Medium

1. API surface assumptions diverge from existing RuntimeConfigResolver and AdminConfigService (connector-config-hot-reload/design.md, specs/config-schemas/spec.md, specs/hot-reload-propagation/spec.md)

The specs reference methods that don't exist on the current classes:

  • RuntimeConfigResolver.getConfig('connectors.jira') — actual method is resolve(key: BoostConfigKey)
  • RuntimeConfigResolver.invalidate('connectors.jira') with a key argument — actual invalidate() takes no arguments (invalidates entire cache, not per-key)
  • AdminConfigService.setConfig() — actual method is setOverride(key: BoostConfigKey, value: unknown)
  • POST /api/boost/admin/config — this route doesn't exist yet

The designs claim to "extend" and "reuse" existing infrastructure, but silently introduce new API surface. This gap could mislead implementers about the scope of changes needed.

Remediation: Add a section to design.md explicitly listing the new methods/routes that need to be added to RuntimeConfigResolver and AdminConfigService, or align the spec method names with the existing API.

2. BoostConfigKey type system requires extension (connector-config-hot-reload/specs/config-schemas/spec.md)

The specs assume RuntimeConfigResolver can resolve arbitrary string keys like 'connectors.jira'. The existing resolve() parameter is typed as BoostConfigKey — a union of literal strings from the boostConfigFields registry (e.g., 'boost.model.baseUrl'). No connectors.* keys exist in that registry. The type system would need to be extended to support dynamic connector-scoped keys.

Remediation: Document in the design that the boostConfigFields registry in schemas.ts must be extended, or the type system refactored to support dynamic key namespaces.

3. Permission name inconsistency across feature areas (ingestion-audit-metrics/design.md, ingestion-audit-metrics/specs/analytics-api/spec.md)

The ingestion-audit-metrics documents use ai-catalog.admin for RBAC gating, while connector-config-hot-reload uses boost.admin, and ingestion-health-dashboard uses "boost admin permissions" generically. The codebase defines boost.admin (in boost-common/src/permissions.ts) — ai-catalog.admin does not exist. Using different permission names across feature areas under the same plan creates an inconsistent RBAC model.

Remediation: Standardize on boost.admin (which already exists) across all four feature areas.

4. Health status "degraded" definition inconsistency (ingestion-health-dashboard/proposal.md vs design.md)

The proposal.md defines degraded as "last sync succeeded but recent failures" (most recent must have succeeded). The design.md defines it as "Mixed results (not all-success and not all-failure)" (broader — includes cases where most recent failed). The health-status-api/spec.md follows the design.md definition. These are materially different classifications.

Remediation: Align proposal.md with the design.md definition ("mixed results"), which is the more precise and consistently used definition.

Low

5. "EXISTING Requirements" label applied to non-existent features (connector-config-hot-reload/specs/config-admin-ui/spec.md, config-schemas/spec.md, hot-reload-propagation/spec.md)

Several spec files label their scenarios as "EXISTING Requirements" but describe behavior for Jira, GitHub, and GitLab connectors that don't exist in the codebase. The entity providers that exist are kagenti-entity-provider and llamastack-entity-provider. This labeling could confuse readers about what's already implemented.

6. Misleading worst-case propagation timing (connector-config-hot-reload/design.md)

The design states worst-case latency as "Cache TTL (30s) + reconciliation interval (5m) = 5m30s". But the same document describes immediate cache invalidation on DB write. The 30s TTL only applies as a safety net if invalidation fails. Normal-case latency is just the reconciliation interval (~5m).

7. SQL DECIMAL(5,3) doesn't enforce 0-1 range (ingestion-audit-metrics/design.md)

The boost_quality_scores.score column uses DECIMAL(5,3) which allows values up to 99.999, but the spec states scores are normalized to 0.000-1.000. A CHECK (score >= 0 AND score <= 1) constraint would enforce this at the database level.

8. db-only config fields omitted from connector schema spec (connector-config-hot-reload/specs/config-schemas/spec.md)

The design.md lists three db-only fields (lastSyncTimestamp, lastSyncOutcome, runStatus) in the configScope table, but the config-schemas spec scenarios omit them. Clarify whether these belong in the connector config Zod schema or are stored separately.

Dimensions Reviewed

Dimension Result
Correctness 4 medium, 4 low findings — API surface gaps, internal inconsistencies
Security No findings — clean docs-only diff, no secrets, no injection patterns
Intent & coherence PR follows established openspec patterns; JIRA plan reference (RHDHPLAN-1513) provides authorization context
Style & conventions New files match existing openspec structure (design/proposal/specs/tasks format)
Docs currency No staleness — referenced cross-links exist; no index needs updating
Cross-repo contracts Skipped — no exported interfaces modified

Labels: PR modifies only the boost workspace openspec documentation directory.

Previous run (13)

Review

Verdict: Approve

This PR adds OpenSpec documentation for four feature areas under RHDHPLAN-1513: Connector Configuration Hot-Reload, Ingestion Audit Logging & Metrics, Ingestion Health Admin Dashboard, and Upstream Schema Alignment Readiness. All 27 files are documentation-only (markdown specifications and YAML metadata) with no code changes.

Assessment

Structure & conventions: All four feature areas follow the established OpenSpec pattern already in the repository (.openspec.yaml + proposal.md + design.md + tasks.md + specs/*/spec.md). The directory structure is consistent with existing changes like platform-operations-deployment and agent-creation-discovery.

Consolidation handling: The ingestion-audit-metrics area correctly marks its .openspec.yaml with status: consolidated and includes structured consolidation metadata (absorbed_by, plan, reason, date). Individual specs within this area also carry consolidation banners pointing to the absorbing epics (RHIDP-15277, RHIDP-15280). This is well-handled.

Cross-references: RHDHPLAN and RHIDP ticket references are consistent throughout. The consolidation notes in each design/proposal document correctly describe which stories migrated where, and surviving epics are identified.

Spec quality: The specifications are thorough — design docs include clear decisions with rationale, scenarios use GIVEN/WHEN/THEN format, and task breakdowns include JIRA story references and priority levels. The connector-config-hot-reload design, for example, documents the configScope annotation strategy with a clear rationale for which fields are yaml-only vs db-overridable.

Low-severity finding

db-only configScope undocumented (connector-config-hot-reload): In tasks.md section 8.2, the documentation task lists three configScope values: yaml-only, db-overridable, db-only. However, the design.md and spec files only define and use two values: yaml-only and db-overridable. The db-only value appears nowhere else in the specifications. This should be either documented in the design/spec or removed from the tasks list to avoid confusion during implementation.

Summary

This is a well-structured documentation PR that follows established repository conventions. The specifications provide comprehensive coverage of four feature areas with clear design decisions, rationale, and task breakdowns. The one minor inconsistency noted above does not block approval.


Labels: PR adds OpenSpec documentation for boost workspace ingestion features

@fullsend-ai-review fullsend-ai-review Bot added the requires-manual-review Review requires human judgment label Jul 14, 2026
@rhdh-qodo-merge

rhdh-qodo-merge Bot commented Jul 14, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (1) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Context used
✅ Compliance rules (platform): 37 rules
✅ Cross-repo context
  Not relevant to this PR: redhat-developer/rhdh
  Not relevant to this PR: redhat-developer/rhdh-chart
  Not relevant to this PR: redhat-developer/rhdh-operator
  Not relevant to this PR: redhat-developer/rhdh-local

Grey Divider


Action required

1. connectors.jira missing boost. prefix ✓ Resolved 📘 Rule violation ⚙ Maintainability
Description
New OpenSpec docs define/use configuration keys like connectors.jira and security.mode that do
not start with boost., which violates the required config key namespace convention. This can lead
to inconsistent configuration naming and implementation drift when these specs are turned into code.
Code

workspaces/boost/openspec/changes/connector-config-hot-reload/design.md[50]

+  await runtimeConfigResolver.getConfig('connectors.jira');
Relevance

⭐⭐⭐ High

Boost config keys are consistently namespaced (e.g., boost.security.mode/boost.model.*); docs
inconsistencies were previously fixed.

PR-#3521
PR-#3292

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
PR Compliance ID 2401 requires configuration keys/usages in changed files to start with boost..
The added specs/docs include non-namespaced keys such as connectors.jira (and security.mode)
which contradict this rule.

Rule 2401: Configuration keys must use the boost.* namespace
workspaces/boost/openspec/changes/connector-config-hot-reload/design.md[49-60]
workspaces/boost/openspec/changes/security-safety-governance/design.md[39-42]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
OpenSpec documentation introduces configuration keys/usages that do not start with `boost.` (e.g., `connectors.jira`, `security.mode`), violating the required `boost.*` namespace.

## Issue Context
The compliance rule requires all app behavior configuration keys in changed files to be under the `boost.*` namespace to keep naming consistent across YAML, runtime overrides, and code.

## Fix Focus Areas
- workspaces/boost/openspec/changes/connector-config-hot-reload/design.md[50-50]
- workspaces/boost/openspec/changes/security-safety-governance/design.md[41-41]
- workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-admin-ui/spec.md[102-108]
- workspaces/boost/openspec/changes/connector-config-hot-reload/specs/config-schemas/spec.md[37-46]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

2. README status mismatch 🐞 Bug ⚙ Maintainability
Description
workspaces/boost/README.md states all OpenSpec changes are in draft status, but this PR adds
ingestion-audit-metrics with status: consolidated, making the workspace documentation
inconsistent and potentially misleading.
Code

workspaces/boost/openspec/changes/ingestion-audit-metrics/.openspec.yaml[R1-3]

+schema: spec-driven
+created: 2026-07-08
+status: consolidated
Relevance

⭐⭐⭐ High

Team has accepted README/doc consistency fixes when workspace docs drift from actual
metadata/versions.

PR-#3621

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The README makes a blanket claim that all specs are draft, but the newly added OpenSpec metadata
sets the ingestion-audit-metrics change to consolidated, contradicting that claim.

workspaces/boost/README.md[34-39]
workspaces/boost/openspec/changes/ingestion-audit-metrics/.openspec.yaml[1-8]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The Boost workspace README claims all OpenSpec changes are currently in **draft** status, but the PR introduces an OpenSpec change explicitly marked `status: consolidated`, so the README statement is no longer true.

## Issue Context
A consolidated/closed change is valid, but the README should not imply every change directory is draft after this PR.

## Fix Focus Areas
- workspaces/boost/README.md[34-39]
- workspaces/boost/openspec/changes/ingestion-audit-metrics/.openspec.yaml[1-8]

## What to change
- Update the README sentence to reflect that most/active specs are draft, while some may be consolidated/closed (or explicitly exclude/list consolidated changes).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Non-boost.* permission identifiers 📘 Rule violation ⚙ Maintainability
Description
New OpenSpec docs introduce permission identifiers such as ai-catalog.admin,
ai-catalog.asset.read.usage-docs, and chat.read that do not start with boost.. This violates
the required permission naming prefix and will create inconsistent RBAC identifiers if implemented
as written.
Code

workspaces/boost/openspec/changes/ingestion-audit-metrics/design.md[17]

+- Analytics REST API RBAC-gated with `ai-catalog.admin` permission
Relevance

⭐ Low

Repo already uses non-boost permission names like ai-catalog.admin in merged docs; naming prefix not
enforced historically.

PR-#3703

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
PR Compliance ID 2409 requires all permission identifiers in changed files to start with boost..
The added OpenSpec documents reference several permissions that omit the prefix (e.g.,
ai-catalog.admin, ai-catalog.asset.read.usage-docs, chat.read).

Rule 2409: Permission identifiers must use the boost.* naming prefix
workspaces/boost/openspec/changes/ingestion-audit-metrics/design.md[15-18]
workspaces/boost/openspec/changes/ai-catalog-frontend/design.md[51-54]
workspaces/boost/openspec/changes/security-safety-governance/tasks.md[5-9]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
OpenSpec docs/specs/tasks define permission identifiers that do not start with the required `boost.` prefix (e.g., `ai-catalog.admin`, `ai-catalog.asset.read.usage-docs`, `chat.read`).

## Issue Context
The compliance rule requires all permission identifiers used in changed files to begin with `boost.` to ensure consistent RBAC naming across the system.

## Fix Focus Areas
- workspaces/boost/openspec/changes/ingestion-audit-metrics/design.md[17-17]
- workspaces/boost/openspec/changes/ai-catalog-frontend/design.md[51-54]
- workspaces/boost/openspec/changes/ai-catalog-frontend/specs/entity-extensions/spec.md[65-73]
- workspaces/boost/openspec/changes/security-safety-governance/tasks.md[5-9]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

To customize comments, go to the Qodo configuration screen, or learn more in the docs.

Qodo Logo

@rhdh-qodo-merge rhdh-qodo-merge Bot added documentation Improvements or additions to documentation enhancement New feature or request labels Jul 14, 2026
@gabemontero

Copy link
Copy Markdown
Contributor Author

Thanks for the thorough review. Addressing all 9 findings:

1. Credential rotation latency mismatch — Agreed. The spec correctly calculates ~6 minutes (60s kubelet + 5min reconciliation). The ≤90s claim in design.md Decision 4 incorrectly used the 30s cache TTL instead of the reconciliation interval as the dominant factor. Updating design.md to match the spec.

2. API endpoint pattern inconsistency — Agreed. Standardizing all admin config save calls on POST /api/boost/admin/config with key-value body ({ key: "connectors.jira", value: {...} }), consistent with the existing AdminConfigService "DB Override Save" scenario. Fixes missing /api/boost prefix in toggle scenarios and design.md.

3. Disabled connector filtering conflict — Agreed. Updating design.md Decision 4 to clarify that disabled connectors are excluded by default but available via ?includeDisabled=true (matching the spec and UI).

4. PostgreSQL-incompatible INDEX syntax — Agreed. Replacing MySQL-style inline INDEX with separate CREATE INDEX statements in both ingestion-audit-metrics/design.md and ingestion-health-dashboard/design.md.

5. Undefined health state — Agreed. Redefining health derivation: Healthy = all N succeeded, Degraded = mixed (not all-success and not all-failure), Failing = all N failed. This covers all combinations including [success, success, failure].

6. Underspecified edge cases — Agreed. Adding explicit derivation for fewer-than-3 attempts: 0 = Unknown (never synced), 1+ all-success = Healthy, all-failure = Failing, mixed = Degraded.

7. Missing tls.caFile from schema spec — Agreed. Adding tls.caFile (string, yaml-only) to the Jira connector config schema in config-schemas/spec.md.

8. Orphaned db-only configScope — Agreed. Removing from proposal.md — no concrete fields use this scope.

9. Inconsistent UI propagation messages — Agreed. Updating "within 30 seconds" to "within 30 seconds + next reconciliation cycle" for consistency with the propagation spec.

gabemontero and others added 2 commits July 14, 2026 16:35
Rebase consistency fix: update stale skill entity references to match
confirmed category taxonomy (skill → AIResource kind, spec.type: skill).

- proposal.md: Skill row Resource/ai-skill → AIResource/skill
- annotation-specification/spec.md: ai-skill (Resource kind) → skill (AIResource kind)
- ingestion-audit-metrics/design.md: spec.type: ai-skill → spec.type: skill (2 locations)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nspecs

Addresses all 9 findings from fullsend review agent on PR redhat-developer#3755:

1. Credential rotation latency: fix ≤90s claim → ~6 minutes (60s kubelet
   + 5min reconciliation) in design.md Decision 4 and Risks section
2. API endpoint pattern: standardize on POST /api/boost/admin/config with
   key-value body; fix missing /api/boost prefix in toggle scenarios
3. Disabled connector filtering: reconcile design.md with spec — excluded
   by default, available via ?includeDisabled=true
4. PostgreSQL INDEX syntax: replace MySQL-style inline INDEX with separate
   CREATE INDEX statements in both design.md files
5. Health derivation gap: redefine as Healthy/Degraded/Failing/Unknown
   covering all attempt combinations including [success, success, failure]
6. Fewer-than-3 edge cases: explicit derivation for 0-2 attempts using
   same rules as 3-attempt case
7. Missing tls.caFile: add to Jira connector config schema in spec
8. Orphaned db-only configScope: remove from proposal.md
9. Propagation messages: fix 'within 30 seconds' → 'within 30 seconds +
   next reconciliation cycle'

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 14, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 8:41 PM UTC · Ended 8:47 PM UTC
Commit: a04cf01 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added ready-for-merge All reviewers approved — ready to merge and removed requires-manual-review Review requires human judgment labels Jul 14, 2026
@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 8:41 PM UTC · Completed 8:47 PM UTC
Commit: a04cf01 · View workflow run →

…ly state

Re-add db-only to proposal.md configScope list (reverses earlier removal).
Add concrete db-only fields (lastSyncTimestamp, lastSyncOutcome, runStatus)
to design.md Decision 2 table with rationale paragraph explaining these are
pure runtime state with no YAML baseline.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 16, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:00 PM UTC · Completed 10:13 PM UTC
Commit: 73bbfe1 · View workflow run →

@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment workspace/boost Boost workspace (Backstage AI plugin) and removed ready-for-merge All reviewers approved — ready to merge labels Jul 16, 2026

@mareklibra mareklibra left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few comments added - mostly clarifications or conflicts in specs.

Comment thread workspaces/boost/openspec/changes/ingestion-health-dashboard/proposal.md Outdated
Comment thread workspaces/boost/openspec/changes/connector-config-hot-reload/design.md Outdated
Comment thread workspaces/boost/openspec/changes/connector-config-hot-reload/tasks.md Outdated
Comment thread workspaces/boost/openspec/changes/connector-config-hot-reload/design.md Outdated
Comment thread workspaces/boost/openspec/changes/ingestion-health-dashboard/proposal.md Outdated
Comment thread workspaces/boost/openspec/changes/connector-config-hot-reload/design.md Outdated
Comment thread workspaces/boost/openspec/changes/ingestion-health-dashboard/design.md Outdated
gabemontero added a commit to gabemontero/rhdh-plugins that referenced this pull request Jul 21, 2026
…nspecs

Addresses all 9 findings from fullsend review agent on PR redhat-developer#3755:

1. Credential rotation latency: fix ≤90s claim → ~6 minutes (60s kubelet
   + 5min reconciliation) in design.md Decision 4 and Risks section
2. API endpoint pattern: standardize on POST /api/boost/admin/config with
   key-value body; fix missing /api/boost prefix in toggle scenarios
3. Disabled connector filtering: reconcile design.md with spec — excluded
   by default, available via ?includeDisabled=true
4. PostgreSQL INDEX syntax: replace MySQL-style inline INDEX with separate
   CREATE INDEX statements in both design.md files
5. Health derivation gap: redefine as Healthy/Degraded/Failing/Unknown
   covering all attempt combinations including [success, success, failure]
6. Fewer-than-3 edge cases: explicit derivation for 0-2 attempts using
   same rules as 3-attempt case
7. Missing tls.caFile: add to Jira connector config schema in spec
8. Orphaned db-only configScope: remove from proposal.md
9. Propagation messages: fix 'within 30 seconds' → 'within 30 seconds +
   next reconciliation cycle'

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
- Fix augment workspace paths to boost paths in proposal.md Impact
- Standardize config keys to boost.connectors.* namespace (BoostConfigKey)
- Align method names: resolve(), invalidate() (no args), setOverride()
- Align tasks.md REST endpoints with design.md POST /api/boost/admin/config
- Document flat-key write semantics (single leaf BoostConfigKey per write)
- Clarify startup gate (catalog.providers.*.enabled) vs runtime sync-skip
- Align degraded health derivation with design.md (mixed results)
- Remove db-only runtime state from configScope table (health store owns it)
- Replace in-memory run registry with coreServices.cache/SchedulerService

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
…4j field alignment

- error-classification/spec.md: error_type → errorType in THEN clauses
  (14 occurrences). DB column is snake_case error_type, but ErrorClassifier
  returns camelCase errorType per the interface at line 105 and tasks.md.

- analytics-api/spec.md: neo4j_status.connected → neo4j_connected to
  match design.md Decision 2 line 113 flat field structure.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
@gabemontero

Copy link
Copy Markdown
Contributor Author

Cascade propagation audit — 2 fixes (cff8163699)

Full scan of all 4 change directories on this branch for authoritative-value consistency (design.md → proposal.md, tasks.md, spec.md files).

Fixed

  1. ingestion-health-dashboard/specs/error-classification/spec.md — 14 THEN clauses used error_type (snake_case DB column name) instead of errorType (camelCase ErrorClassifier return field). The scenarios describe the ErrorClassifier output, not the DB column, so they must use camelCase to match the interface defined at line 105 and in tasks.md.

  2. ingestion-audit-metrics/specs/analytics-api/spec.md line 41 — Used neo4j_status: { connected: ... } (nested object with shortened field). Design.md Decision 2 line 113 defines it as flat fields: { neo4j_connected: boolean, last_sync: string, entity_count: number }. Aligned spec to match.

Verified clean (no issues)

  • connector-config-hot-reload — all config paths, field names, permissions, API routes, timing values consistent across all 6 files
  • upstream-schema-alignment — design.md table is intentionally "Example mapping entries" (2 RFC-targeted rows); complete 7-row table correctly lives in proposal.md. All category vs spec.type distinctions correct after prior bf31cd379c fix.

Methodology

Parallel agents scanned each change directory independently, checking every proper noun, config path, enum value, field name, API route, package name, and permission string against design.md as the authoritative source.

@gabemontero

Copy link
Copy Markdown
Contributor Author

Grill-me results:

  ---
  Adversarial Review — Consolidated Findings

  Category A: Actionable text fixes (recommend making these)

  A1. ingestion-health-dashboard/design.md line 95 — misleading parenthetical
  - Current: "five connector states (matching Decision 1's health status enum)"
  - Problem: Decision 1 defines 4 health status values (healthy/degraded/failing/unknown). The five-state model adds Disabled (an enabled: false overlay), so it doesn't "match" the enum — it extends it.
  - Proposed fix: "five connector states (extending Decision 1's health status enum with Disabled as an enabled=false overlay)"

  Category B: Spec format inconsistency (flagging, not recommending fix)

  B1. Five spec files use flat scenario format instead of the established ## ADDED/EXISTING Requirements > ### Requirement: > #### Scenario: hierarchy:
  - ingestion-audit-metrics/specs/analytics-api/spec.md (numbered ### Scenario N:)
  - ingestion-audit-metrics/specs/audit-events/spec.md (numbered ### Scenario N:)
  - ingestion-audit-metrics/specs/eval-hub-integration/spec.md (numbered ### Scenario N:)
  - upstream-schema-alignment/specs/annotation-specification/spec.md (flat ## Scenario: with --- dividers)
  - upstream-schema-alignment/specs/migration-readiness-tooling/spec.md (flat ## Scenario: with --- dividers)

  The other 6 spec files on this branch use the established hierarchy. This is a consistency issue but reformatting 5 files is a large change — Deferring this until we are ready to code against the specs in question, and we determin the after an initial pass the fullsend coding agent would benefit from it.

  Category C: Dismissed false positives

  ┌─────┬─────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────────────┐
  │  #  │                         Finding                         │                                    Why dismissed                                    │
  ├─────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────┤
  │ C1  │ ai-catalog-entity-model/design.md doesn't exist         │ EXISTS on main with full 7-row table — cross-refs are valid                         │
  ├─────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────┤
  │ C2  │ upstream-schema-alignment mapping table only has 2 rows │ Intentionally labeled "Example mapping entries" — full table is in main's design.md │
  ├─────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────┤
  │ C3  │ Decision 3 missing Unknown status                       │ Line 83 lists (Healthy/Degraded/Failing/Unknown) — Unknown IS present               │
  ├─────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────┤
  │ C4  │ File paths in specs reference code that doesn't exist   │ Pre-implementation specs — they describe what to BUILD                              │
  ├─────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────┤
  │ C5  │ connector-config-hot-reload code paths don't exist      │ Same — pre-implementation specs                                                     │
  ├─────┼─────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────────┤
  │ C6  │ outcome? optionality in ingestion-audit-metrics         │ TypeScript ? on interface field is standard optional marker                         │
  └─────┴─────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────────┘


…te model extends, not matches, Decision 1 enum

Decision 1 defines 4 health status values (healthy/degraded/failing/unknown).
Decision 4's five-state model adds Disabled as an enabled=false overlay —
it extends the enum, not matches it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 24, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 10:48 PM UTC · Ended 11:09 PM UTC
Commit: fca12c7 · View workflow run →

@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:48 PM UTC · Completed 11:08 PM UTC
Commit: fca12c7 · View workflow run →

@gabemontero
gabemontero dismissed mareklibra’s stale review July 24, 2026 23:16

What GitHub is flagging is mareklibra's "Changes Requested" review (submitted July 20, review ID 4733251845). Even though all of mareklibra's inline comments have been addressed and resolved, the review itself still has state CHANGES_REQUESTED. Mareklibra's follow-up on July 22 was only a COMMENTED review — it didn't clear the "Changes Requested" state.

@gabemontero gabemontero added ready-for-merge All reviewers approved — ready to merge and removed requires-manual-review Review requires human judgment labels Jul 24, 2026

@mareklibra mareklibra left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on the previous comments, I am not flagging ai-catalog.admin and boost.admin any further. However, we should align them before implementation.

Comment thread workspaces/boost/openspec/changes/connector-config-hot-reload/design.md Outdated
Comment thread workspaces/boost/openspec/changes/connector-config-hot-reload/proposal.md Outdated
Comment thread workspaces/boost/openspec/changes/connector-config-hot-reload/design.md Outdated
gabemontero added a commit to gabemontero/rhdh-plugins that referenced this pull request Jul 27, 2026
…nspecs

Addresses all 9 findings from fullsend review agent on PR redhat-developer#3755:

1. Credential rotation latency: fix ≤90s claim → ~6 minutes (60s kubelet
   + 5min reconciliation) in design.md Decision 4 and Risks section
2. API endpoint pattern: standardize on POST /api/boost/admin/config with
   key-value body; fix missing /api/boost prefix in toggle scenarios
3. Disabled connector filtering: reconcile design.md with spec — excluded
   by default, available via ?includeDisabled=true
4. PostgreSQL INDEX syntax: replace MySQL-style inline INDEX with separate
   CREATE INDEX statements in both design.md files
5. Health derivation gap: redefine as Healthy/Degraded/Failing/Unknown
   covering all attempt combinations including [success, success, failure]
6. Fewer-than-3 edge cases: explicit derivation for 0-2 attempts using
   same rules as 3-attempt case
7. Missing tls.caFile: add to Jira connector config schema in spec
8. Orphaned db-only configScope: remove from proposal.md
9. Propagation messages: fix 'within 30 seconds' → 'within 30 seconds +
   next reconciliation cycle'

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
…ng, removeOverride

Thread 1: catalog.providers → ai-catalog.providers across 7 files (11 edits)
Threads 2-4: 'within 30s' → 'cache refresh ≤30s; takes effect on next
reconciliation cycle' across 5 files (9 edits)
Thread 5: add removeOverride/DELETE mechanism for clearing DB overrides,
specify cron-over-intervalMs precedence, add matching UI/tasks/schema specs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 27, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 7:33 PM UTC · Ended 7:50 PM UTC
Commit: 300ac1c · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment and removed ready-for-merge All reviewers approved — ready to merge labels Jul 27, 2026
@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 7:33 PM UTC · Completed 7:50 PM UTC
Commit: 300ac1c · View workflow run →

@gabemontero

gabemontero commented Jul 27, 2026

Copy link
Copy Markdown
Contributor Author

Re: fullsend review (4790936057) — all findings are pre-existing, unrelated to Marek's review fixes

The commit addressing @mareklibra 's 5 review threads was a1edca3c07 (namespace renames, TTL wording cascade, removeOverride mechanism). The fullsend review ran against the updated HEAD and surfaced 6 inline findings — all pre-existing issues in files/lines untouched by that commit.

Fixed 5 of 6 in a24504d3cf:

# Finding File Fix
1 "Confluence" should be "GitLab" (typo) ingestion-audit-metrics/tasks.md:27 Connector list corrected
2 runStatus not a stored column connector-config-hot-reload/design.md:86 Clarified as derived concept
3 TIMESTAMP vs TIMESTAMPTZ mismatch ingestion-audit-metrics/design.md:133 Changed to TIMESTAMPTZ
4 __schemaVersion vs Zod validation gap config-schemas/spec.md:85 Clarified as metadata key, must register in boostConfigFields
5 Cron example mangled by markdown config-admin-ui/spec.md:74 Wrapped in backticks

Not fixing:

| 6 | ## Overview heading convention | annotation-specification/spec.md:8 | Stylistic, no correctness impact |

The remaining summary-only findings (spec format deviations in ingestion-audit-metrics, missing "Specification Coverage" blocks in ingestion-health-dashboard, feat vs docs PR title prefix) are also pre-existing and unrelated to either commit on this push.

1. Confluence → GitLab typo in ingestion-audit-metrics/tasks.md
2. runStatus clarified as derived, not a stored column (design.md)
3. TIMESTAMP → TIMESTAMPTZ in boost_quality_scores schema
4. __schemaVersion Zod/boostConfigFields interaction clarified
5. Cron example backtick-wrapped to prevent markdown mangling

All pre-existing issues unrelated to the Marek review fixes in a1edca3c07.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 27, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 8:00 PM UTC · Ended 8:19 PM UTC
Commit: f0fea0e · View workflow run →

@sonarqubecloud

Copy link
Copy Markdown

@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 8:00 PM UTC · Completed 8:19 PM UTC
Commit: f0fea0e · View workflow run →

@gabemontero

Copy link
Copy Markdown
Contributor Author

ok @mareklibra both your comments and fullsend-review's have been processed

PTAL

@mareklibra
mareklibra enabled auto-merge (squash) July 28, 2026 06:25
@mareklibra
mareklibra merged commit e31ec88 into redhat-developer:main Jul 28, 2026
36 checks passed
@gabemontero
gabemontero deleted the rhdhplan-1513-openspecs branch July 28, 2026 13:19
JslYoon pushed a commit to JslYoon/rhdh-plugins that referenced this pull request Jul 28, 2026
* chore(boost): RHDHPLAN-1513 openspec content for operations & upstream alignment

Create OpenSpec changes covering all 4 epics and 13 stories under
RHDHPLAN-1513 (AI Catalog Ingestion Operations & Upstream Schema Alignment):

- ingestion-health-dashboard (RHIDP-15331): 5 stories, 3 specs, 7 files
  Health status API, admin health UI, error classification

- connector-config-hot-reload (RHIDP-15332): 3 stories, 3 specs, 7 files
  Zod config schemas, RuntimeConfigResolver hot-reload, config admin UI

- ingestion-audit-metrics (RHIDP-15333): 3 stories, 3 specs, 7 files
  Sync audit events, analytics REST API, Eval Hub integration

- upstream-schema-alignment (RHIDP-15334): 2 stories, 2 specs, 6 files
  Annotation specification document, dry-run migration-readiness tooling

Cross-references RHDHPLAN-1507 (entity model), RHDHPLAN-1508 (audit
logging pattern), RHDHPLAN-1510 (connectors), and upstream Backstage
RFCs #32062 and #33060.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 openspec consolidation for RHIDP-15333 closure

RHIDP-15333 (Ingestion Audit Logging & Metrics) closed and absorbed
by RHIDP-15277 (AI Catalog RBAC Audit Logging, RHDHPLAN-1508).

Closed epic openspec (ingestion-audit-metrics/):
- .openspec.yaml status → consolidated with absorbing epic metadata
- proposal.md, design.md, tasks.md: consolidation headers with story mapping
- specs/audit-events: status → Consolidated into RHIDP-15280
- specs/analytics-api: status → Consolidated into RHIDP-15277
- specs/eval-hub-integration: status → Consolidated into RHIDP-15277

Surviving epic openspecs (consolidation cross-references):
- ingestion-health-dashboard: proposal.md + design.md annotations
- connector-config-hot-reload: proposal.md + design.md annotations
- upstream-schema-alignment: proposal.md + design.md annotations

Jira updates:
- RHIDP-15343 → CONSOLIDATED into RHIDP-15280, closed as Duplicate
- RHIDP-15344 → CONSOLIDATED into RHIDP-15277 scope, closed as Duplicate
- RHIDP-15345 → CONSOLIDATED into RHIDP-15277 scope, closed as Duplicate
- Blocks links: RHIDP-15295→15338, RHIDP-15258→15346, RHIDP-15258→15347

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 align skill entity mapping to AIResource/skill

Rebase consistency fix: update stale skill entity references to match
confirmed category taxonomy (skill → AIResource kind, spec.type: skill).

- proposal.md: Skill row Resource/ai-skill → AIResource/skill
- annotation-specification/spec.md: ai-skill (Resource kind) → skill (AIResource kind)
- ingestion-audit-metrics/design.md: spec.type: ai-skill → spec.type: skill (2 locations)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(boost): RHDHPLAN-1513 address fullsend review findings across openspecs

Addresses all 9 findings from fullsend review agent on PR redhat-developer#3755:

1. Credential rotation latency: fix ≤90s claim → ~6 minutes (60s kubelet
   + 5min reconciliation) in design.md Decision 4 and Risks section
2. API endpoint pattern: standardize on POST /api/boost/admin/config with
   key-value body; fix missing /api/boost prefix in toggle scenarios
3. Disabled connector filtering: reconcile design.md with spec — excluded
   by default, available via ?includeDisabled=true
4. PostgreSQL INDEX syntax: replace MySQL-style inline INDEX with separate
   CREATE INDEX statements in both design.md files
5. Health derivation gap: redefine as Healthy/Degraded/Failing/Unknown
   covering all attempt combinations including [success, success, failure]
6. Fewer-than-3 edge cases: explicit derivation for 0-2 attempts using
   same rules as 3-attempt case
7. Missing tls.caFile: add to Jira connector config schema in spec
8. Orphaned db-only configScope: remove from proposal.md
9. Propagation messages: fix 'within 30 seconds' → 'within 30 seconds +
   next reconciliation cycle'

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 document db-only configScope for runtime-only state

Re-add db-only to proposal.md configScope list (reverses earlier removal).
Add concrete db-only fields (lastSyncTimestamp, lastSyncOutcome, runStatus)
to design.md Decision 2 table with rationale paragraph explaining these are
pure runtime state with no YAML baseline.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 address review feedback on openspec docs

- Fix augment workspace paths to boost paths in proposal.md Impact
- Standardize config keys to boost.connectors.* namespace (BoostConfigKey)
- Align method names: resolve(), invalidate() (no args), setOverride()
- Align tasks.md REST endpoints with design.md POST /api/boost/admin/config
- Document flat-key write semantics (single leaf BoostConfigKey per write)
- Clarify startup gate (catalog.providers.*.enabled) vs runtime sync-skip
- Align degraded health derivation with design.md (mixed results)
- Remove db-only runtime state from configScope table (health store owns it)
- Replace in-memory run registry with coreServices.cache/SchedulerService

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 address fullsend review findings on PR redhat-developer#3755

Fix 1 (medium): getConfig() → resolve(), connectors.jira →
boost.connectors.jira in config-schemas/spec.md — missed in Marek fix

Fix 2: Remove stale db-only configScope from proposal.md and tasks.md
— runtime state lives in health store, not config resolver (per Marek)

Fix 3: Add tls.caFile to task 1.1 Jira Zod schema field list —
matches design.md configScope table

Fix 4: Replace :connectorId Express-style placeholder with
<connectorId> in task 6.1 query param

Fix 5: Add CHECK(score >= 0.0 AND score <= 1.0) constraint to
boost_quality_scores DECIMAL column in ingestion-audit-metrics design

Fix 6: Remove unconventional Spec: title prefix from 5 spec files

Fix 7: Standardize status header format in 2 upstream-schema-alignment
specs — bold+emoji → blockquote format matching other specs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 address Marek review feedback on PR redhat-developer#3755

Thread 1: augment → boost workspace references in ingestion-health-dashboard
Thread 2: resolve() leaf key alignment — use boost.connectors.jira.enabled
  not boost.connectors.jira (namespace)
Thread 3: drop 'in-memory or' from task 6.2 — SchedulerService only
Thread 4: sync_attempts → boost_sync_attempts table naming convention
Thread 6: add config namespace mapping table, remove tls.caFile from
  boost.connectors scope (belongs under catalog.providers)
Thread 7: add unknown status to health status enum in proposal and spec

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 address fullsend review findings on PR redhat-developer#3755

- ingestion-audit-metrics/design.md: add permission namespace rationale
  blockquote explaining ai-catalog.admin vs boost.admin coexistence
- ingestion-health-dashboard/design.md: update Decision 4 from
  three-state to five-state model, adding Degraded and Unknown
  UX states to match Decision 1 health status enum

Assisted-by: claude-opus-4-6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 address mareklibra review — permission namespace, schema cleanup, enum alignment

- Realign permission namespace: boost.admin → ai-catalog.admin across
  ingestion-health-dashboard and connector-config-hot-reload specs
  (RHDHPLAN-1513 is catalog ingestion operations, not agent operations)
- Replace requireBoostAdmin() middleware with permissions.authorize()
  using ai-catalog.admin permission per AGENTS.md framework requirement
- Fix health status enum: four-state → five-state model (add degraded),
  add Unknown to status badge colors and task lists
- Fix bare connectors.jira.* → boost.connectors.jira.* in
  hot-reload-propagation spec and tasks
- Remove tls.caFile, credentials.*, namespace from boost.connectors
  Zod schemas (these are catalog.providers fields, not boost.connectors)
- Clarify dual enabled gates: catalog.providers.*.enabled (startup
  registration) vs boost.connectors.*.enabled (runtime sync-skip)
- Fix admin_config → boost_admin_config table name
- Clarify schema versioning with leaf-only DB writes and connector-level
  Zod validation
- Fix package name @boost/migration-readiness →
  @red-hat-developer-hub/backstage-plugin-boost-migration-readiness

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 address fullsend review — entity mapping, cross-ref, field subset

- Model Server mapping: Component/model-server → Resource/ai-model-server
  (aligns with ai-catalog-entity-model/design.md Decision 1 on main)
- Add note: will pivot to upstream Backstage API extension
  (backstage/backstage#34476) if it becomes available
- Cross-reference: catalog-entities/spec.md → ai-catalog-entity-model/design.md
  Decision 1 (covers all 7 category values)
- Tasks 1.3/1.4: 'same field pattern' → connector-appropriate field subset
  (GitHub/GitLab have 4 fields vs Jira's 6)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 add rule and skill-bundle to annotation values and mapping table

Align annotation-specification/spec.md and proposal.md with
ai-catalog-entity-model/design.md Decision 1 which defines 7
category values. The annotation listing and mapping table previously
listed only 5, omitting rule and skill-bundle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 complete 5-to-7 alignment in tasks.md and spec.type list

Continue alignment with ai-catalog-entity-model/design.md Decision 1:
- tasks.md task 1.1: add rule, skill-bundle to category values
- tasks.md task 3.1: 'five' -> 'seven' AI Asset types
- annotation-specification/spec.md: add rule, skill-bundle to
  spec.type list; fix model-server -> ai-model-server spec.type

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 address mareklibra review round — package name, status enum, config schema clarity

- Replace @boost/migration-readiness with @red-hat-developer-hub/backstage-plugin-boost-migration-readiness
  across tasks.md, design.md, and spec.md (4 locations) + add workspace path
- Remove tls/credentials/yaml-only from connector-config-hot-reload/proposal.md
  (those fields live under catalog.providers, not boost.connectors)
- Fix health status enum: remove disabled from status values (healthy/degraded/failing/unknown);
  disabled is an enabled=false overlay, not a status value — propagated to design.md and tasks.md
- Clarify per-leaf Zod validation vs connector-level aggregate validation in config-schemas/spec.md
- Clarify schemaVersion storage: explicit __schemaVersion leaf key, bump on migration only,
  concurrent leaf writes non-conflicting, GET-prefix merge behavior

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 align spec.type skill-bundle → ai-skill-bundle per entity model

proposal.md mapping table and annotation-specification spec.type list
both had spec.type: skill-bundle — the authoritative entity model
design (ai-catalog-entity-model/design.md Decision 1, on main) defines
this as ai-skill-bundle. The rhdh.io/ai-asset-category annotation
value remains skill-bundle (correct — category ≠ spec.type).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 cascade propagation — errorType casing, neo4j field alignment

- error-classification/spec.md: error_type → errorType in THEN clauses
  (14 occurrences). DB column is snake_case error_type, but ErrorClassifier
  returns camelCase errorType per the interface at line 105 and tasks.md.

- analytics-api/spec.md: neo4j_status.connected → neo4j_connected to
  match design.md Decision 2 line 113 flat field structure.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 correct Decision 4 parenthetical — five-state model extends, not matches, Decision 1 enum

Decision 1 defines 4 health status values (healthy/degraded/failing/unknown).
Decision 4's five-state model adds Disabled as an enabled=false overlay —
it extends the enum, not matches it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 address Marek review — namespace, TTL wording, removeOverride

Thread 1: catalog.providers → ai-catalog.providers across 7 files (11 edits)
Threads 2-4: 'within 30s' → 'cache refresh ≤30s; takes effect on next
reconciliation cycle' across 5 files (9 edits)
Thread 5: add removeOverride/DELETE mechanism for clearing DB overrides,
specify cron-over-intervalMs precedence, add matching UI/tasks/schema specs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

* fix(boost): RHDHPLAN-1513 address fullsend review — pre-existing issues

1. Confluence → GitLab typo in ingestion-audit-metrics/tasks.md
2. runStatus clarified as derived, not a stored column (design.md)
3. TIMESTAMP → TIMESTAMPTZ in boost_quality_scores schema
4. __schemaVersion Zod/boostConfigFields interaction clarified
5. Cron example backtick-wrapped to prevent markdown mangling

All pre-existing issues unrelated to the Marek review fixes in a1edca3c07.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: gabemontero <gmontero@redhat.com>

---------

Signed-off-by: gabemontero <gmontero@redhat.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request requires-manual-review Review requires human judgment workspace/boost Boost workspace (Backstage AI plugin)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants